package start

import (
	"gitee.com/aviptle/goclean/go11jin/vblog01/conf"
	"gitee.com/aviptle/goclean/go11jin/vblog01/ioc"
	"gitee.com/aviptle/goclean/go11jin/vblog01/logger"
	"gitee.com/aviptle/goclean/go11jin/vblog01/protocol"
	"github.com/gin-gonic/gin"
	"github.com/spf13/cobra"

	// 加载所有的业务实现和接口实现, init
	// 统一到apps包下面, 然后只导入一次,
	// apps: 代表当前已经开发完成的业务功能实例和接口实例
	// 把所有的业务模块全部加载
	_ "gitee.com/aviptle/goclean/go11jin/vblog01/apps"
	// 可以直接导入
	// // 注册api handler
	// _ "gitee.com/go-course/go11/vblog/apps/blog/api"
	// // 注册 blog 业务具体实现MySQL
	// _ "gitee.com/go-course/go11/vblog/apps/blog/impl"
)

var (
	configType string
	configFile string
)

// root command
// vblog-api start
var Cmd = &cobra.Command{
	Use:   "start",
	Short: "vblog",
	Long:  ``,
	Run: func(cmd *cobra.Command, args []string) {
		// 命令具体的执行逻辑
		// vblog-api start xxx xxx xxx
		// [xxx xxx xxx]

		// 程序的组装

		// 1. 加载全局配置
		switch configType {
		case "env":
			_, err := conf.LoadConfigFromEnv()
			cobra.CheckErr(err)
		default:
			// 默认通过配置文件加载
			_, err := conf.LoadConfigFromToml(configFile)
			cobra.CheckErr(err)
		}

		// 加载业务逻辑实现
		r := gin.Default()

		// blog 业务模块
		// blogService := &impl.Impl{}
		// err := blogService.Init()
		// cobra.CheckErr(err)
		// apiHandler := api.NewHandler(blogService)
		// apiHandler.Registry(r)

		// v2.0 所有注册到ioc里面的对象统一初始化
		logger.L().Debug().Msgf("controllers: %s", ioc.ShowConntrollers())
		logger.L().Debug().Msgf("apis: %s", ioc.ShowApis())

		err := ioc.InitController()
		cobra.CheckErr(err)
		err = ioc.InitHttpApi("/vblog/api/v1", r)
		cobra.CheckErr(err)

		// 启动协议服务器
		httpServer := protocol.NewHttp(r)
		err = httpServer.Start()
		cobra.CheckErr(err)
	},
}

func init() {
	// Flag --config-type -t file -f etc/config.toml
	Cmd.Flags().StringVarP(&configType, "config-type", "t", "file", "程序加载配置的方式")
	Cmd.Flags().StringVarP(&configFile, "config-file", "f", "etc/config.toml", "配置文件的路径")
}
